package br.com.sgpv2.entity.pessoa;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.sgpv2.entity.movimentacao.Movimentacao;
import br.com.sgpv2.entity.organograma.Departamento;
import br.com.sgpv2.entity.organograma.Nivel;
import br.com.sgpv2.entity.organograma.Secretaria;


/**
 * Representa uma entidade Contrato no sistema.
 */
@Entity
@Table(name = "con_contrato")
@SequenceGenerator(name = "sequenceContrato", sequenceName = "con_contrato_con_id_seq")
public class Contrato implements Serializable{
	
	private static final long serialVersionUID = 7285032430724278159L;
	
	private int id;
	private Secretaria secretaria;
	private Departamento departamento;
	private Nivel nivel;
	private Double depIRRF;
	private Double depSalario;
	private boolean contribuicaoPrevidenciaria;
	private Pessoa pessoa;
	private String matricula;
	private BigDecimal salarioBase;
	private String dataInicio;
	private String dataFim;
	private List<Movimentacao> movimentacoes;
	private BancoEnum banco;
	private String agencia;
	private String conta;
	
	
	/**
	 * Recupera o valor do ID da entidade.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "con_id", nullable = false)
	public int getId() {
		return id;
	}
	/**
	 * Configura o valor do ID da entidade.
	 */
	public void setId(int id) {
		this.id = id;
	}
	
	/**
	 * Recupera o valor do ID da pessoa.
	 */
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "pes_id", nullable = false)
	public Pessoa getPessoa() {
		return pessoa;
	}

	/**
	 * Configura o valor do ID da pessoa.
	 */
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	
	
	/**
	 * Recupera a secretaria do contrato.
	 */
	@OneToOne
	@JoinColumn(name = "sec_id", nullable=false)
	public Secretaria getSecretaria() {
		return secretaria;
	}
	
	/**
	 * Configura a secretaria do contrato.
	 */
	public void setSecretaria(Secretaria secretaria) {
		this.secretaria = secretaria;
	}
	
	/**
	 * Recupera o departamento do contrato.
	 */
	@OneToOne
	@JoinColumn(name = "dep_id", nullable=false)
	public Departamento getDepartamento() {
		return departamento;
	}
	
	/**
	 * Configura o departamento do contrato.
	 */
	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}
	
	/**
	 * Recupera o nivel do contrato.
	 */
	@OneToOne
	@JoinColumn(name = "niv_id", nullable=false)
	public Nivel getNivel() {
		return nivel;
	}
	
	/**
	 * Configura o nivel do contrato.
	 */
	public void setNivel(Nivel nivel) {
		this.nivel = nivel;
	}
	
	/**
	 * Recupera o depIRRF do contrato.
	 */
	@Column(name="con_dep_irrf")
	public Double getDepIRRF() {
		return depIRRF;
	}
	
	/**
	 * Configura o depIRRF do contrato.
	 */
	public void setDepIRRF(Double depIRRF) {
		this.depIRRF = depIRRF;
	}
	
	/**
	 * Recupera o depSalario do contrato.
	 */
	@Column(name="con_dep_salario")
	public Double getDepSalario() {
		return depSalario;
	}
	/**
	 * Configura o depSalario do contrato.
	 */
	public void setDepSalario(Double depSalario) {
		this.depSalario = depSalario;
	}
	
	/**
	 * Recupera o contribuicaoPrevidenciaria do contrato.
	 */
	@Column(name="con_contribuicao_previdenciaria")
	public boolean isContribuicaoPrevidenciaria() {
		return contribuicaoPrevidenciaria;
	}
	/**
	 * Configura o contribuicaoPrevidenciaria do contrato.
	 */
	public void setContribuicaoPrevidenciaria(boolean contribuicaoPrevidenciaria) {
		this.contribuicaoPrevidenciaria = contribuicaoPrevidenciaria;
	}
	
	/**
	 * Recupera a matricula do contrato.
	 */
	@Column(name="con_matricula", nullable=false)
	public String getMatricula() {
		return matricula;
	}
	
	/**
	 * Configura a matricula do contrato.
	 */
	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	
	/**
	 * Recupera o salario base do contrato.
	 */
	@Column(name="con_salario_base")
	public BigDecimal getSalarioBase() {
		return salarioBase;
	}
	
	/**
	 * Configura o salario base do contrato.
	 */
	public void setSalarioBase(BigDecimal salarioBase) {
		this.salarioBase = salarioBase;
	}
	
	/**
	 * Data início do contrato
	 * @return
	 */
	@Column(name="con_data_inicio", nullable=false)
	public String getDataInicio() {
		return dataInicio;
	}
	
	public void setDataInicio(String dataInicio) {
		this.dataInicio = dataInicio;
	}
	
	/**
	 * Data fim do contrato
	 * @return
	 */
	@Column(name="con_data_fim")
	public String getDataFim() {
		return dataFim;
	}
	
	public void setDataFim(String dataFim) {
		this.dataFim = dataFim;
	}
	/**
	 * Recupera a lista de contratos da pessoa.
	 */
	@OneToMany(mappedBy = "contrato")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL ,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	public List<Movimentacao> getMovimentacoes() {
		return movimentacoes;
	}
	public void setMovimentacoes(List<Movimentacao> movimentacoes) {
		this.movimentacoes = movimentacoes;
	}
	
	@Column(name = "con_banco")
	@Enumerated(EnumType.STRING)
	public BancoEnum getBanco() {
		return banco;
	}
	public void setBanco(BancoEnum banco) {
		this.banco = banco;
	}
	
	
	@Column(name = "con_agencia")
	public String getAgencia() {
		return agencia;
	}
	public void setAgencia(String agencia) {
		this.agencia = agencia;
	}
	
	@Column(name = "con_conta")
	public String getConta() {
		return conta;
	}
	public void setConta(String conta) {
		this.conta = conta;
	}
	
}
